package com.chuxing.system.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.chuxing.config.PermissionsState;
import com.chuxing.config.SecurityRole;
import com.chuxing.domain.DTO.TClassListMembersDTO;
import com.chuxing.domain.Result;
import com.chuxing.domain.TClassMembers;
import com.chuxing.domain.VO.PageResultVO;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.system.service.ITClassMembersService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import static com.chuxing.domain.Result.success;

/**
 * 班级成员信息Controller
 * 
 * @author 刘祺
 * @date 2024-12-14
 */
@RestController
@RequestMapping("/system/classMembers")
@Tag(name = "班级成员信息服务", description = "班级成员信息服务相关接口")
@Slf4j
@RequiredArgsConstructor
public class TClassMembersController
{
    private final ITClassMembersService tClassService;

    /**
     * 查询班级成员信息列表
     */
    @GetMapping("/list")
    @Operation(summary = "查询班级成员信息列表", description = "查询班级成员信息列表")
    public Result<PageResultVO> list(TClassListMembersDTO tClassListMembersDTO)
    {
        log.info("查询班级成员信息列表{}", tClassListMembersDTO);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        PageResultVO list = tClassService.selectTClassList(tClassListMembersDTO);
        return Result.success( "获取班级信息列表成功", list);
    }

    /**
     * 导出班级成员信息列表
     */
    @Operation(summary = "管理员导出班级成员信息列表", description = "管理员导出班级成员信息列表")
    @PostMapping("/export")
    public void export(HttpServletResponse response,@RequestBody TClassListMembersDTO tClassListMembersDTO) throws Exception {
        // 记录导出日志
        log.info("管理员导出班级成员信息列表");
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tClassService.export(response, tClassListMembersDTO);
    }

    /**
     * 获取班级成员信息详细信息
     */
    @Operation(summary = "管理员获取班级成员信息详细信息", description = "管理员获取班级成员信息详细信息")
    @GetMapping(value = "/{id}")
    public Result<TClassMembers> getInfo(@PathVariable("id") Long id)
    {
        log.info("管理员获取班级成员信息详细信息，参数为：{}", id);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        TClassMembers tClassMembers = tClassService.selectTClassById(id);
        return Result.success( "管理员获取班级信息成功", tClassMembers);
    }

    /**
     * 新增班级成员信息
     */
    @Operation(summary = "管理员新增班级成员信息", description = "管理员新增班级成员信息")
    @PostMapping
    public Result<Object> add(@RequestBody TClassMembers tClassMembers)
    {
        log.info("管理员新增班级成员信息，参数为：{}", tClassMembers);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tClassService.insertTClass(tClassMembers);
        return success( "管理员新增班级信息成功");
    }

    /**
     * 修改班级成员信息
     */
    @Operation(summary = "管理员修改班级成员信息", description = "管理员修改班级成员信息")
    @PutMapping
    public Result<Object> edit(@RequestBody TClassMembers tClassMembers)
    {
        log.info("管理员修改班级成员信息，参数为：{}", tClassMembers);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tClassService.updateTClass(tClassMembers);
        return success( "修改班级信息成功");
    }

    /**
     * 删除班级成员信息
     */
    @Operation(summary = "管理员删除班级成员信息", description = "管理员删除班级成员信息")
	@DeleteMapping("/{ids}")
    public Result<Object> remove(@PathVariable Long[] ids)
    {
        log.info("管理员删除班级成员信息，参数为：{}", ids);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tClassService.deleteTClassByIds(ids);
        return success( "管理员删除班级信息成功");
    }
}
